#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"
#include "DHT11.h"
#include "stdio.h"
#include "string.h"
//#include "Systick.h"
#include "main_Page.h"
#include "smoke.h"
//任务1控制块
OS_TCB Task1_TCB;

void task1(void *parg);

CPU_STK task1_stk[500];			//任务1的任务堆栈，大小为128字，也就是512字节

//任务2控制块
OS_TCB Task2_TCB;
CPU_STK task2_stk[5000];
void task2(void *parg);

//任务3控制块
OS_TCB Task3_TCB;
CPU_STK task3_stk[5000];	//任务2的任务堆栈，大小为128字，也就是512字节
void task3(void *parg);

		



//主函数
int main(void)
{
	OS_ERR err;

	
	delay_init(168);  								//时钟初始化,利用Systick定时器，为操作系统产生周期节拍 
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//中断分组配置
	uart_init(9600);  				 			//串口初始化


	//OS初始化，它是第一个运行的函数,初始化各种的全局变量，例如中断嵌套计数器、优先级、存储器
	OSInit(&err);		   	 						//初始化UCOSIII
	

	//创建任务1，着重填写前8个参数
	OSTaskCreate(	(OS_TCB *)&Task1_TCB,									//任务控制块
					(CPU_CHAR *)"Task1",									//任务的名字，自定义
					(OS_TASK_PTR)task1,										//任务函数
					(void *)0,												//传递参数
					(OS_PRIO)3,											 	//任务的优先级		
					(CPU_STK *)task1_stk,									//任务堆栈基地址
					(CPU_STK_SIZE)500/10,									//任务堆栈深度限位，用到这个位置，任务不能再继续使用
					(CPU_STK_SIZE)500,										//任务堆栈大小			
					(OS_MSG_QTY)0,											//禁止任务消息队列
					(OS_TICK)0,												//默认时间片长度																
					(void  *)0,												//不需要补充用户存储区
					(OS_OPT)OS_OPT_TASK_NONE,								//没有任何任务选项
					&err													//返回的错误码
				);

	
	//创建任务2
	OSTaskCreate(	(OS_TCB *)&Task2_TCB,									//任务控制块
					(CPU_CHAR *)"Task2",									//任务的名字
					(OS_TASK_PTR)task2,										//任务函数
					(void *)0,												//传递参数
					(OS_PRIO)3,											 	//任务的优先级		
					(CPU_STK *)task2_stk,									//任务堆栈基地址
					(CPU_STK_SIZE)5000/10,									//任务堆栈深度限位，用到这个位置，任务不能再继续使用
					(CPU_STK_SIZE)5000,										//任务堆栈大小			
					(OS_MSG_QTY)0,											//禁止任务消息队列
					(OS_TICK)0,												//默认时间片长度																
					(void  *)0,												//不需要补充用户存储区
					(OS_OPT)OS_OPT_TASK_NONE,								//没有任何选项
					&err													//返回的错误码
				);
	
	
					
	

//	OSStart(&err);      //开启UCOSIII  进行任务调度
//					
//	//创建任务3
	OSTaskCreate(	(OS_TCB *)&Task3_TCB,									//任务控制块
					(CPU_CHAR *)"Task3",									//任务的名字
					(OS_TASK_PTR)task3,										//任务函数
					(void *)0,												//传递参数
					(OS_PRIO)3,											 	//任务的优先级		
					(CPU_STK *)task3_stk,									//任务堆栈基地址
					(CPU_STK_SIZE)5000/10,									//任务堆栈深度限位，用到这个位置，任务不能再继续使用
					(CPU_STK_SIZE)5000,										//任务堆栈大小			
					(OS_MSG_QTY)0,											//禁止任务消息队列
					(OS_TICK)0,												//默认时间片长度																
					(void  *)0,												//不需要补充用户存储区
					(OS_OPT)OS_OPT_TASK_NONE,								//没有任何选项
					&err													//返回的错误码
				);

	OSStart(&err);      //开启UCOSIII  进行任务调度					

 

}




//task1任务函数, 两个任务之间必须解藕 。 
void task1(void *parg)
{  
	 u8 task1_num=0;   
	printf("task1 is create ok\r\n");
 	OS_ERR err;
	System_Init() ; 
 
	while(1)
	{
//		OLED_ShowCHinese(0,6,6,0);
//		OLED_ShowCHinese(16,6,7,0);
//		printf("task1 is %d ok\r\n" , task1_num);
//		printf("task1 has been excucced:%d times\r\n",task1_num++);
		main_Page(err) ; 
		
//		delay_ms(10000) ; 
		
	}
}

//task2 是处理烟雾 临界区
void task2(void *p_arg)
{
//	System_Init() ; 
	u8 task2_num=0;
	
//		System_Init() ; 
	CPU_SR_ALLOC() ; // 申请保护CPU的状态。
	OS_ERR err; 
	p_arg = p_arg;
//	DHT_Init() ; 
	MQ_ADC_Init() ; // MQADC 
	W25Q128_Init();
	AT24C02_Init() ; 
	w25Q128_SectorErase(0x00) ; 
//	Tim_6(8400 , 1000) ; 
//	printf("task2 is create ok\r\n");
//	uint16_t smoke_adc_val ; 
	while(1)
	{
//		OS_CRITICAL_ENTER();
		smoke_check() ; 
		
		
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //让出CPU，延时1s
//		OSTimeDly() ; 
//		OS_CRITICAL_EXIT();
	}
}





void task3(void *p_arg)
{
	
	CPU_SR_ALLOC() ; // 申请保护CPU的状态。
	OS_CRITICAL_ENTER();
	Security_Init() ; 
	OS_CRITICAL_EXIT();
	OS_ERR err;  
	
	while(1)
	{
		OS_CRITICAL_ENTER();
		printf("task3") ; 
		 Security_Start() ; 
		OS_CRITICAL_EXIT();

		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //让出CPU，延时1s
	}
}






//task3任务函数
//void task3(void *parg) // 信号量
//{  
//	printf("task1 is create ok\r\n");
//	OS_ERR err;
//	u8 task1_num=0;
//	while(1)
//	{
//		task1_num++;	//任务1cc执行次数加1 注意task1_num2加到255的时候会清零！！
//		printf("task1 has been excucced:%d times\r\n",task1_num);
//		
//		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //让出CPU，延时1s
//	}
//}
